home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / Telnet 2.6.1d1 4⁄26⁄94 Folder / source / ftp / macutil.c < prev    next >
Text File  |  1993-10-24  |  8KB  |  283 lines

  1. /*  MACUTIL.C
  2. *****************************************************************
  3. *    NCSA Telnet for the Macintosh                                *
  4. *                                                                *
  5. *    National Center for Supercomputing Applications                *
  6. *    Software Development Group                                    *
  7. *    152 Computing Applications Building                            *
  8. *    605 E. Springfield Ave.                                        *
  9. *    Champaign, IL  61820                                        *
  10. *                                                                *
  11. *    Copyright (c) 1986-1993,                                    *
  12. *    Board of Trustees of the University of Illinois                *
  13. *****************************************************************
  14. *    April, 1993    Entirely rewritten by Jim Browne to use HFS.
  15. */
  16.  
  17. #ifdef MPW
  18. #pragma segment FTPServer
  19. #endif
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23.  
  24. #include "TelnetHeader.h"        
  25. #include "maclook.proto.h"
  26. #include "telneterrors.h"
  27. #include "DlogUtils.proto.h"
  28. #include "macutil.proto.h"
  29. #include "debug.h"
  30.  
  31. /* Some globals for file lookup */
  32. char FileName[256];
  33.  
  34. //    Get the name of the directory identified by vRefNum & dirID
  35. //    (works for volumes too... [dirID = 2])
  36. void GetDirectoryName(short vRefNum, long dirID, Str32 name)
  37. {
  38.     CInfoPBRec    theInfo;
  39.     
  40.     WriteZero((Ptr)&theInfo, sizeof(CInfoPBRec));
  41.     theInfo.dirInfo.ioVRefNum = vRefNum;
  42.     theInfo.dirInfo.ioDrDirID = dirID;
  43.     theInfo.dirInfo.ioNamePtr = name;
  44.     theInfo.dirInfo.ioFDirIndex = -1;        // Only give me the Directory Info
  45.     PBGetCatInfoSync(&theInfo);
  46. }
  47.  
  48. //    Convert the given volume name to a reference number.  Returns the default vRefNum
  49. //    if the volume specified is not found.
  50. short VolumeNameToRefNum(Str32 volumeName)
  51. {
  52.     short    retval;
  53.     
  54.     if (SetVol(volumeName, 0) != noErr) return(-1);
  55.     GetVol(NULL, &retval);
  56.     
  57.     return(retval);
  58. }
  59.     
  60. void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName)
  61. {
  62.     CInfoPBRec    block;
  63.     Str255        directoryName;
  64.     OSErr        err;
  65.  
  66.     fullPathName[0] = '\0';
  67.  
  68.     block.dirInfo.ioDrParID = dirID;
  69.     block.dirInfo.ioNamePtr = directoryName;
  70.     do {
  71.             block.dirInfo.ioVRefNum = vRefNum;
  72.             block.dirInfo.ioFDirIndex = -1;
  73.             block.dirInfo.ioDrDirID = block.dirInfo.ioDrParID;
  74.             if (err = PBGetCatInfoSync(&block)) return;
  75.             pstrcat(directoryName, (StringPtr)"\p/");
  76.             pstrinsert(fullPathName, directoryName);
  77.     } while (block.dirInfo.ioDrDirID != 2);
  78.  
  79.     pstrinsert(fullPathName, "\p/");
  80. }
  81.  
  82. //    ChangeDirectory will change the directory relative from the provided dirID and 
  83. //        vRefNum.  It handles preceding ".." modifiers as well as absolute pathnames.
  84. short ChangeDirectory(long *dirID, short *vRefNum,char *pathname)
  85. {
  86.     CInfoPBRec        theDirInfo;
  87.     char        tempst[256], *nSlash, *start;
  88.     short         NumberOfLevelsToGoUp = 0, temp, localvRefNum;
  89.     long        junk1, junk2, localdirID;
  90.     OSErr        err;
  91.     
  92.     start = pathname;
  93.     localvRefNum = *vRefNum;
  94.     localdirID = *dirID;
  95.     
  96.     while ( (nSlash = strchr(pathname,'/') ) !=0L) {
  97.         if (( (nSlash - pathname) == 2) && (*pathname=='.') && (*(pathname+1) =='.') ) {
  98.             pathname += 3L;
  99.             start = pathname;
  100.             NumberOfLevelsToGoUp++;
  101.             }
  102.         else {
  103.             *nSlash=':';
  104.             pathname=nSlash + 1L;
  105.             }
  106.         }
  107.     
  108.     if ( strcmp("..",pathname)==0) {
  109.         start[0]=0;
  110.         NumberOfLevelsToGoUp++;
  111.         }
  112.  
  113.     // Now start points to the beginning of a relative pathname devoid of ".."'s, and colons
  114.     //        for seperators rather than slashes.
  115.     
  116.     if ( *start==':') {                            // This is a fully qualified pathname
  117.         if (NumberOfLevelsToGoUp) return(1);    // Someone did a "../..//blah"...
  118.         nSlash = strchr(start+1L, ':');            // Seperate out volume name
  119.         if (strlen(start) == 1)                    // Someone did a "cd /"
  120.             localdirID = 2;                        //        Use top level directory
  121.         else {
  122.             if (nSlash != NULL) *nSlash = 0;
  123.             strcpy(tempst, start+1);            // Remove leading colon
  124.             strcat(tempst, ":");                // Add trailing colon
  125.             CtoPstr(tempst);
  126.             SetVol((StringPtr)tempst, 0);
  127.             GetVol(NULL, &temp);
  128.             GetWDInfo(temp, &localvRefNum, &junk1, &junk2);
  129.             localdirID = 2;
  130.  
  131.             if (nSlash != NULL) {                // There's more than a volume name
  132.                 *nSlash = ':';                    // Restore the leading slash
  133.                 strcpy( tempst, nSlash);
  134.                 CtoPstr(tempst);                // tempst now contains relative pathname
  135.                 
  136.                 WriteZero((Ptr)&theDirInfo, (long)sizeof(CInfoPBRec));
  137.                 theDirInfo.dirInfo.ioVRefNum = localvRefNum;        // Now find the directory on the volume
  138.                 theDirInfo.dirInfo.ioDrDirID = localdirID;
  139.                 theDirInfo.dirInfo.ioNamePtr = (StringPtr)tempst;
  140.                 theDirInfo.dirInfo.ioFDirIndex = 0;
  141.                 if (err = PBGetCatInfo(&theDirInfo, FALSE) != noErr) return(1);
  142.                 localdirID = theDirInfo.dirInfo.ioDrDirID;
  143.                 }        
  144.             }
  145.         }
  146.     else
  147.         {    // This is a relative pathname, start by taking care of any ".."s...
  148.             WriteZero((Ptr)&theDirInfo, (long)sizeof(CInfoPBRec));
  149.             while (NumberOfLevelsToGoUp && (localdirID != 2)) {
  150.                 theDirInfo.dirInfo.ioVRefNum = localvRefNum;
  151.                 theDirInfo.dirInfo.ioDrDirID = localdirID;
  152.                 theDirInfo.dirInfo.ioNamePtr = 0;
  153.                 theDirInfo.dirInfo.ioFDirIndex = -1;
  154.                 if (err = PBGetCatInfo(&theDirInfo, FALSE) != noErr) return(1);
  155.                 localdirID = theDirInfo.dirInfo.ioDrParID;
  156.                 NumberOfLevelsToGoUp--;
  157.                 }
  158.         
  159.             // Now use the relative pathname to find out the actual directory ID
  160.             // Relative pathnames must begin with a colon, so put on on the beginning
  161.             
  162.             if(start[0]) {
  163.                 strcpy(tempst+1, start);
  164.                 tempst[0] = ':';
  165.                 CtoPstr(tempst);
  166.                 WriteZero((Ptr)&theDirInfo, (long)sizeof(CInfoPBRec));
  167.                 theDirInfo.dirInfo.ioVRefNum = localvRefNum;
  168.                 theDirInfo.dirInfo.ioDrDirID = localdirID;
  169.                 theDirInfo.dirInfo.ioNamePtr = (StringPtr)tempst;
  170.                 theDirInfo.dirInfo.ioFDirIndex = 0;
  171.                 if (err = PBGetCatInfo(&theDirInfo, FALSE) != noErr) return(1);
  172.                 localdirID = theDirInfo.dirInfo.ioDrDirID;
  173.                 }
  174.         }
  175.     
  176.     *dirID = localdirID;        // Everything went ok, change the dirID and vRefNum
  177.     *vRefNum = localvRefNum;        
  178.     return(0);
  179. }
  180.  
  181. short wccheck(char *file, char *template)    /* BYU - routine now returns (short) for recursion. */
  182. {
  183.     while(*template) {
  184.         if (*template=='*') {
  185.             template++;
  186.             if (*template) {
  187.                 while((*file) && !wccheck(file,template)) file++;    /* BYU */
  188.                 if ((*file)==0) return(0);
  189.                 }
  190.             else return(1);
  191.             continue;
  192.             }
  193.         else
  194.             if ((*template!='?') && (*template!=*file)) return(0);
  195.         template++;file++;
  196.         }
  197.     if (*file)            /* BYU */
  198.         return(0);        /* BYU */
  199.     else                /* BYU */
  200.         return(1);        /* BYU */
  201. }
  202.  
  203. /* firstname
  204. *  find the first name in the given directory which matches the wildcard
  205. *  specification    */
  206. char *firstname(char *spec, long dirID, short vRefNum, CInfoPBRec *finfo)
  207. {
  208.     CInfoPBRec *localfinfo;
  209.     
  210.     localfinfo = (CInfoPBRec *) NewPtrClear(sizeof(CInfoPBRec));    
  211.     
  212.     finfo->hFileInfo.ioNamePtr=(StringPtr) FileName;
  213.     finfo->hFileInfo.ioFDirIndex=1;
  214.     finfo->hFileInfo.ioVRefNum = vRefNum;
  215.     finfo->hFileInfo.ioDirID = dirID;
  216.     
  217.     BlockMove(finfo, localfinfo, sizeof(CInfoPBRec));
  218.     if (PBGetCatInfo(localfinfo,FALSE)!=0) {
  219.         DisposePtr((Ptr)localfinfo);
  220.         return(0L);
  221.         }
  222.  
  223.     FileName[FileName[0]+1]=0;
  224.     
  225.     while(!wccheck(&FileName[1],spec)) {
  226.         finfo->hFileInfo.ioFDirIndex++;
  227.         BlockMove(finfo, localfinfo, sizeof(CInfoPBRec));
  228.         if (PBGetCatInfo(localfinfo,FALSE)!=0) {
  229.             DisposePtr((Ptr)localfinfo);
  230.             return(0L);
  231.             }
  232.         FileName[FileName[0]+1]=0;
  233.         }
  234.  
  235.     if (localfinfo->hFileInfo.ioFlAttrib & 16)  {
  236.         FileName[++FileName[0]]='/';
  237.         FileName[FileName[0]+1]=0;
  238.         }
  239.  
  240.     DisposePtr((Ptr)localfinfo);
  241.     return(&FileName[1]);
  242. }
  243.  
  244. /**********************************************************************/
  245. /* nextname
  246. *  modify the path spec to contain the next file name in the
  247. *  sequence as given by DOS
  248. *
  249. *  if at the end of the sequence, return NULL
  250. */
  251. char *nextname(char *spec, CInfoPBRec *finfo)
  252. {
  253.     CInfoPBRec *localfinfo;
  254.     
  255.     localfinfo = (CInfoPBRec *) NewPtrClear(sizeof(CInfoPBRec));    
  256.     finfo->hFileInfo.ioFDirIndex++;
  257.  
  258.     BlockMove(finfo, localfinfo, sizeof(CInfoPBRec));
  259.     if (PBGetCatInfo(localfinfo,FALSE)!=0) {
  260.         DisposePtr((Ptr)localfinfo);
  261.         return(0L);
  262.         }
  263.  
  264.     FileName[FileName[0]+1]=0;
  265.     while(!wccheck(&FileName[1], spec)) {
  266.         putln(&FileName[1]);
  267.         finfo->hFileInfo.ioFDirIndex++;
  268.         BlockMove(finfo, localfinfo, sizeof(CInfoPBRec));
  269.         if (PBGetCatInfo(localfinfo,FALSE)!=0) {
  270.             DisposePtr((Ptr) localfinfo);
  271.             return(0L);
  272.             }
  273.         FileName[FileName[0]+1]=0;
  274.         }
  275.     
  276.     if (localfinfo->hFileInfo.ioFlAttrib & 16)  {
  277.         FileName[++FileName[0]]='/';
  278.         FileName[FileName[0]+1]=0;
  279.         }
  280.  
  281.     DisposePtr((Ptr)localfinfo);
  282.     return(&FileName[1]);
  283. }